package com.rh.number.common;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor // Lombok 生成无参构造方法
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiResult<T> {
    private int code;
    private String msg;
    private T data;

    // ------------------------- 手动定义全参构造方法 -------------------------
    public ApiResult(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public int getCode() {
        return this.code;
    }

    public String getMsg() {
        return this.msg;
    }
    public T getData() {
        return this.data;
    }


    // ------------------------- 静态工厂方法 -------------------------
    /**
     * 成功响应（带数据）
     */
    public static <T> ApiResult<T> success(T data) {
        return new ApiResult<>(200, "操作成功", data);
    }

    /**
     * 成功响应（仅消息）
     */
    public static ApiResult<Void> success(String msg) {
        return new ApiResult<>(200, msg, null);
    }

    /**
     * 成功响应（无数据）
     */
    public static <T> ApiResult<T> success() {
        return new ApiResult<>(200, "操作成功",null); // code=200
    }
    /**
     * 错误响应（自定义状态码和消息）
     */
    public static <T> ApiResult<T> error(int code, String msg) {
        return new ApiResult<>(code, msg, null);
    }

    /**
     * 错误响应（默认 500 状态码）
     */
    public static <T> ApiResult<T> fail(String msg) {
        return new ApiResult<>(500, msg, null);
    }

    /**
     * 错误响应（自定义状态码）
     */
    public static <T> ApiResult<T> fail(int code, String msg) {
        return new ApiResult<>(code, msg, null);
    }
}